import { ResultData } from '@/common/dto/result';
import { applyDecorators, Type } from '@nestjs/common';
import { ApiOkResponse, getSchemaPath } from '@nestjs/swagger';

export const ApiResult = <TModel extends Type<any>>(
  model: TModel,
  isArray?: boolean,
  isPager?: boolean
) => {
  const baseTypeName = ['String', 'Number', 'Boolean'];
  let items = null;
  if (model && baseTypeName.includes(model.name)) {
    items = { type: model.name.toLocaleLowerCase() };
  } else {
    // getSchemaPath 获取传递过来的类的反射信息
    items = { $ref: getSchemaPath(model) };
  }
  let prop = null;
  if (isArray && isPager) {
    prop = {
      type: 'object',
      properties: {
        list: {
          type: 'array',
          items,
        },
        total: {
          type: 'number',
          default: 0,
        },
      },
    };
  } else if (isArray) {
    prop = {
      type: 'array',
      items,
    };
  } else if (model) {
    prop = items;
  } else {
    prop = { type: 'null', default: null };
  }
  // applyDecorators 作用：将装饰器应用到指定的装饰器，并返回一个数组，该数组包含装饰器应用后的类型。
  return applyDecorators(
    ApiOkResponse({
      schema: {
        // allOf 作用是将多个schema合并成一个，类似于继承
        allOf: [
          {
            // $ref 作用是引用一个schema，这个schema在全局的schema中定义
            $ref: getSchemaPath(ResultData),
          },
          {
            // properties 是一个对象，它定义了这个schema中的属性
            properties: { data: prop },
          },
        ],
      },
    })
  );
};
